[汇编]压缩BCD码的乘除法算法

来源:百度知道 编辑:UC知道 时间:2024/05/31 17:48:31
不要代码,就说说怎么个过程..
不进行数制转换,就用压缩BCD硬算,多字节无符号的...

把压缩BCD码转换成二进制数再进行乘除运算,把结果转换回压缩BCD码就是了

不进行数制转换,就用压缩BCD硬算,多字节无符号的...
你是要进行大数运算吧,先设计一个BCD格式,比如最多十位,二十位什么的,这样才能通用于所有的BCD运算,不然你BCD长度不一样程序就不通用了。

设计好BCD长度后,就模拟人工手算方式进行运算,你有一个1#数据定义和一个2#数据定义,以及一个3#数据定义存放结果。每个数据都是压缩BCD方式定义的多字节
乘:
取2#数最末位,与1#数最末位相乘,这得用MUL指令(完全杜绝二进制指令那你就累加),转换成BCD格式,结果放在3#数据里,然后与1#倒数第二位进行乘法运算,转换成BCD格式,结果与3#数据移位累加(你得设计出BCD格式的加法),一直到1#数据的所有位完成为止(也可以以1#数据位出现0为终止条件)
2#数最末位完成后,进行2#数的其它位乘法,具体与最末位过程是一样的。当所有位运算完后,3#结果存放的就是符合你要求的BCD格式的数据了。
除:
你得设计出BCD相减算法,用1#数据减2#数据,直到不够减为止,那时的减的次数是商,余下的就是余数了。

综上所述,要完成大数BCD码的乘除运算,没有相应的加减算法支持是不行的,因为按你的意思大数可能超出了32位(8086汇编还只是16位),也就是说,大于65535的BCD码相加你不能依靠机器自有加法指令,只好自己设计相关算法了。

具体加减方式也差不多,和手工相似:
加:
从最末位到第一位,提取各自的BCD码值进行数据相加,加的过程中你要处理进位情况
减:
从最末位到第一位,提取各自的BCD码值进行数据相减,减的过程中你要处理借位情况

当然,具体到编程中去可能没有说的这么简单,这只是个过程描述而已。

以前有本书好像是叫《80386协处理器数值编程》,时间太长了,除当时外也没再关注此书,所以不敢肯定,那上面就有BCD码+-*/的算法,好像也就十来位。你能找到最好,找不到我也没办法,那书早搞丢了。

还有个完成此类问题的思路,当然它也有局限性,